/**
 * Created with JetBrains PhpStorm.
 * User: campaign
 * Date: 10/8/13
 * Time: 6:15 PM
 * To change this template use File | Settings | File Templates.
 */
UE.plugin = (function () {
    var _plugins = {};
    return {
        register: function (pluginName, fn, oldOptionName, afterDisabled) {
            if (oldOptionName && utils.isFunction(oldOptionName)) {
                afterDisabled = oldOptionName;
                oldOptionName = null;
            }
            _plugins[pluginName] = {
                optionName: oldOptionName || pluginName,
                execFn: fn,
                //当插件被禁用时执行
                afterDisabled: afterDisabled
            };
        },
        load: function (editor) {
            utils.each(_plugins, function (plugin) {
                var _export = plugin.execFn.call(editor);
                if (editor.options[plugin.optionName] !== false) {
                    if (_export) {
                        //后边需要再做扩展
                        utils.each(_export, function (v, k) {
                            switch (k.toLowerCase()) {
                                case "shortcutkey":
                                    editor.addshortcutkey(v);
                                    break;
                                case "bindevents":
                                    utils.each(v, function (fn, eventName) {
                                        editor.addListener(eventName, fn);
                                    });
                                    break;
                                case "bindmultievents":
                                    utils.each(utils.isArray(v) ? v : [v], function (event) {
                                        var types = utils.trim(event.type).split(/\s+/);
                                        utils.each(types, function (eventName) {
                                            editor.addListener(eventName, event.handler);
                                        });
                                    });
                                    break;
                                case "commands":
                                    utils.each(v, function (execFn, execName) {
                                        editor.commands[execName] = execFn;
                                    });
                                    break;
                                case "outputrule":
                                    editor.addOutputRule(v);
                                    break;
                                case "inputrule":
                                    editor.addInputRule(v);
                                    break;
                                case "defaultoptions":
                                    editor.setOpt(v);
                            }
                        });
                    }
                } else if (plugin.afterDisabled) {
                    plugin.afterDisabled.call(editor);
                }
            });
            //向下兼容
            utils.each(UE.plugins, function (plugin) {
                plugin.call(editor);
            });
        },
        run: function (pluginName, editor) {
            var plugin = _plugins[pluginName];
            if (plugin) {
                plugin.exeFn.call(editor);
            }
        }
    };
})();
